# -*- coding：utf-8 -*-
"""
@Time:2024-08-1716:18
@Auth:泛彼泊舟
@File:5、面对对象继承.py
@IDE:PyCharm
@模块功能：xxx
"""
"""
继承的方式有两种类型：单继承、多继承
继承的概念：在程序中，继承的描述就是多个类之间的所属关系
- 如果一个B类继承了A类，那么B类会拥有A类所有的属性和方法，
- A类叫做B类的父类，B类是A类的子类

使用继承可以提高代码的使用率，而且可以进行自定义的完善

"""
# 【单继承使用】
class A:
    a = 1
    def __init__(self):
        self.b = 2

    def c(self):
        print("A类中的c实例方法被调用")

    @classmethod
    def d(cls):
        print("A类中的d类方法被调用")

    @staticmethod
    def e():
        print("A类中的e静态方法被调用")

# 单继承
# class B(A):
class B():     # B(继承的类名)
    i = 666

    def f(self):
        print("B类中的f实例被调用")

# 多继承
class C(A, B):  # 如果子类需要继承多个父类，可以在括号中进行添加
    pass

# b1 = B()
# print(b1.a)
# print(b1.b)
# b1.c()
# b1.d()

c1 = C()
 # 使用A类中的类属性，实例属性
print(c1.a)
print(c1.b)
 # 使用A类中的c实例方法
c1.c()
 # 使用B类中类属性
print(c1.i)
 # B类中的f实例方法被调用
c1.f()


"""
注意：
1、如果父类中的属性或者方法重名，优先使用先继承的父类中的属性和方法：
- 如A和B类中都有e方法，c继承时写成C（A,B）,则调用A的e方法
2、子类中的属性或者方法跟父类中的属性方法重名，优先使用子类中的方法或属性
- 其实就是就近原则，A继承了B，A和B都写了一个f方法，调用优先使用的A的
3、当子类和父类的属性或者方法重名，要使用父类中的属性或方法那么可以使用内建函数super（）
- 当不想用子类，就像用父类的，可以使用内置函数super
4、当子类和父类的都有init魔法方法的时候，只会调用子类的init不会使用父类的
- 当父类和子类实例属性重名，手动调用父类init魔法方法时会将重名的实例属性值进行覆盖
"""
class A:
    def c(self):
        pass

class B(A):
    def c(self):
        super().c()